package virtualpostit.com;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import model.PostIt;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
import android.widget.RatingBar;
import android.widget.TextView;

/**
 * Attività che permette all'utente di visionare le info associate ad un post-it. In particolare
 * saranno visualizzati a video il nome sintetico, la data di segnalazione, la descrizione
 * dettagliata, l'autore, la valutazione e in più uno sarà visualizzato uno strumento di valutazione
 * mediante il quale gli utenti non auotri potranno valutare il post-it al più una volta.
 * 
 * @author Gruppo Capo, De Notaris, Pastore e Vento
 * @since Luglio 2011
 */
public class PostItInfoActivity extends Activity implements Observer{

	//Attributi di classe
	private TextView tvName;
	private TextView tvAuthor;
	private TextView tvData;
	private TextView tvDescription;
	private TextView tvRanking;
	private RatingBar tvRate;
	private PostIt p;
	
	/*
	 * @see android.app.Activity#onCreate(android.os.Bundle)
	 */
	@Override
	public void onCreate(Bundle icicle) {
		requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
		super.onCreate(icicle);
		setContentView(R.layout.info_postit);
		tvName = (TextView) findViewById(R.id.tvName);
		tvAuthor = (TextView) findViewById(R.id.tvAuthor);
		tvData = (TextView) findViewById(R.id.tvData);
		tvDescription = (TextView) findViewById(R.id.tvDescription);
		tvRanking = (TextView) findViewById(R.id.tvRanking);
		tvRate = (RatingBar) findViewById(R.id.ratingBar);
		tvRate.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener(){
					@Override
			   		public void onRatingChanged(RatingBar ratingBar, float rating,boolean fromUser) {
						ratePostIt(rating);
					}
		});
			   
		displayInfoPostIt();
	}
	
	// Metodo che visualizza le info associate ad un post-it a video
	private void displayInfoPostIt() {
			p = (PostIt)getIntent().getSerializableExtra("postit");
			tvName.setText(p.getName());
			tvAuthor.setText(p.getAuthor());
			tvData.setText(p.getSegnalationDate());
			tvDescription.setText(p.getDescription());
			//limito a 2 cifre dopo la virgola il ranking 
			DecimalFormat df = new DecimalFormat("#.##");
			tvRanking.setText(df.format(p.getRanking()));
			tvRanking.append("/5");
	}
	
	// Metodo che permette all'utente di valutare l'affidabilità del post-it e inserisce 
	// tale utente nell'opportuna tabella del DB in modo che non possa effettuare più valutazioni
	private void ratePostIt(float rating){
		MyDialog md = new MyDialog(this);
		String response="";
		if (p.getAuthor().equals(getSharedPreferences("LoginPREFS",0).getString("username", ""))){
			md.showDialog("Errore","Non puoi valutare un post-it scritto da te stesso!", R.drawable.error);
		}
		else{
			WebService updateRanking = new WebService(LoginActivity.SERVER_HOST + ":"	+ LoginActivity.SERVER_PORT);
			ArrayList<NameValuePair> params = new ArrayList<org.apache.http.NameValuePair>();
			float newRanking=computeNewRanking(p.getRanking(),rating,p.getValutationsNumber());
			params.add(new BasicNameValuePair("ranking", String.valueOf(newRanking)));
			params.add(new BasicNameValuePair("postit", String.valueOf(p.getId())));
			params.add(new BasicNameValuePair("username", p.getAuthor()));
			params.add(new BasicNameValuePair("valutationAuthor", getSharedPreferences("LoginPREFS",0).getString("username", "")));
			response = updateRanking.webPost("/ratePostIt.php", params);
			try {
				String r = response.replace("\n", "");
				Log.i("response updateRanking", r);
				if (!r.equals("null")) {
					md.addObserver(this);
					md.showDialog("Valutazione", "Valutazione avvenuta con successo", R.drawable.ok);
				}
				else  md.showDialog("Attenzione","Hai già valutato questo postit,impossibile procedere!", R.drawable.error);

			} catch (Exception e) {
				Log.i("Errore", e.getMessage());
				md.showDialog("Attenzione",	"Errore del server, riprovare più tardi", R.drawable.error);
			}
		}
	}

	// Metodo che calcola il nuovo ranking dell'autore post valutazione dell'utente. Il 
	// calcolo in questione sarà una media pesata della differenza tra 
	// ranking attuale e ultima valutazione sul numero di valutazioni totali associate
	// all'autore.
	private float computeNewRanking(float actualRanking,float rating,int valutationsNumber){
		float difference=rating-actualRanking;
		float div=difference/(valutationsNumber+1);
		actualRanking+=div;
		return actualRanking;
	}

	/*
	 * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
	 */
	@Override
	public void update(Observable arg0, Object arg1) {
		finish();
	}
}
